# -*- coding: utf-8 -*-
import time

from Settings import Settings

"""
Die Haupt-Exceptionsklasse für die Applikation. Diese sollte nur in Ausnahme-
fällen selbst geworfen werden. Sinnvoller sind spezifischere Exceptions. 
Siehe dazu auch Exceptions.*

@author: Philipp Dermitzel
@date: 2011-03-28
@version: 1.1.3
@todo: Traceback
"""
class MTMCException(Exception):
    
    """
    ----------------------------------------------------------------------------
    Klassenvariablen
    ----------------------------------------------------------------------------
    """
    
    """
    Die für die Exception wichtigen Daten.
    """
    exceptionData = {
        'name'     : 'MTMCException',
        'message'  : None,
        'critical' : False,
        'logging'  : True,
        'time'     : None
    }
    
    """
    Die Klassen-Instanz der programmweiten Settings.
    @type: Settings
    """
    settings = Settings()
   
    """
    ----------------------------------------------------------------------------
    Konstruktor
    ----------------------------------------------------------------------------
    """
    
    """
    Der  Konstruktor.
    Eine Exception kann als kritisch und das Logging für diese Exception 
    eingestellt werden.
    @param value: Der Exception-Text.
    @type value: String
    @param critical: (optional) Kritische Exception
    @type critical: boolean
    @param logging: (optional) Logging für diese Exception aktivieren
    @type logging: boolean
    """ 
    def __init__(self, value, critical = False, logging = None):
        self.value = value
        self.exceptionData['message'] = value
        self.exceptionData['critical'] = critical        
        self.exceptionData['time'] = time.mktime(time.localtime())
        if critical or logging or self.settings.getSetting('debugMode'): 
            self.logException()
    
    """
    To-String-Methode.
    """    
    def __str__(self):
        return repr(self.value)
    
    """
    Loggt die Exception bei Bedarf oder bei in den Settings aktiviertem 
    Debugging. Der Speichertort der Log-File wird ebenfalls in den Settings 
    festgelegt.
    """
    def logException(self):
        logFileHandle = open(self.settings.getSetting('debugFile'),'a')
        logFileHandle.write("%s\t[crit=%s]\t%s\t%s\n" %(
            self.exceptionData['time'], self.exceptionData['critical'], 
            self.exceptionData['name'], self.exceptionData['message']))
        logFileHandle.close()

